package model

import (
	"encoding/json"
	"go_chat_system/common/entity"

	"github.com/garyburd/redigo/redis"
)

// 程序启动后，就初始化一个实例
var (
	MyAccountDao *AccountDao
)

// 定义Account对象对Redis操作的方法
type AccountDao struct {
	pool *redis.Pool
}

// 工厂模式
func NewAccountDao(pool *redis.Pool) (accountDao *AccountDao) {
	accountDao = &AccountDao{
		pool: pool,
	}
	return
}

// 查询Redis中Hash的数据
func (this *AccountDao) getUserById(conn redis.Conn, id int) (user entity.Account, err error) {
	// 查库
	res, err := redis.String(conn.Do("HGET", "users", id))
	if err != nil {
		// redis中没该key
		if err == redis.ErrNil {
			err = ERROR_USER_NOTEXISTS
		}
		return
	}
	// 反序列化
	err = json.Unmarshal([]byte(res), &user)
	return
}

// 数据库入库到Redis
func (this *AccountDao) addUser(conn redis.Conn, key int, value string) (err error) {
	// 判断用户编号是否存在，不存在添加，存在结束操作
	_, err = this.getUserById(conn, key)
	if err == ERROR_USER_NOTEXISTS {
		// 入库
		_, err = conn.Do("HSET", "users", key, value)
	} else {
		err = ERROR_USER_EXISTS
	}
	return
}

// 登陆验证
func (this *AccountDao) Login(userId int, password string) (user entity.Account, err error) {
	// 从连接池获取一个redis连接
	conn := this.pool.Get()
	defer conn.Close()
	// 判断用户编号是否存在
	user, err = this.getUserById(conn, userId)
	if err != nil {
		return
	}
	// 判断密码是否正确
	if user.Password != password {
		err = ERROR_USER_PASSWORD
		return
	}
	return
}

// 注册 入库
func (this *AccountDao) Register(registerMes *entity.Account) (err error) {
	// 从连接池获取一个redis连接
	conn := this.pool.Get()
	defer conn.Close()
	// 插入数据
	data, err := json.Marshal(registerMes)
	if err != nil {
		return
	}
	return this.addUser(conn, registerMes.UserId, string(data))
}
